perm filename MCP.STR[LSP,JRA] blob sn#100801 filedate 1974-05-07 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00006 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002		SOURCE SYNTAX
C00003 00003			Interpteter for source language
C00005 00004	Notes:
C00006 00005	Theorem
C00007 00006	Try it:
C00010 ENDMK
C⊗;
	SOURCE SYNTAX

  Concrete
exp	::= var | const | sum

sum	::= exp + exp


  Abstract
exp	::= var | const | sum

sum	::= struct[ arg1:exp; arg2:exp]





	OBJECT SYNTAX

  Concrete
prog	::= inst prog
	::= ε

inst	::= li | lo | st | ad

li	::= <LI int>

lo	::= <LO adr>

st	::= <ST adr>

ad	::= <AD adr>


adr	::= int




 Abstract
prog	::= seq[inst]

inst	::= li 
	::= lo 
	::= st 
	::= ad

li	::= struct[cnst:int]

lo	::= struct[loc:adr]

	......

adr	::= int

		Interpteter for source language

value[e:exp;xi:environ_s]int
 generic(e)
	[var]      => c(e,xi)
	[const]    => val(e)
	[sum(u,v)] => +(value_s(u,xi),value_s(v,xi))
 end;



		Interpreter for object language

outcome[p:prog;eta:environ_o]environ_o
 on(p;eta,λ[[i,y]step(i y)])

step[i:inst; eta:environ_o] environ_o
 generic(i)
	[li(c)]   => a(AC,c,eta)
	[lo(adr)] => a(AC,cc(adr,eta),eta)
	[st(adr)] => a(adr,cc(AC,eta),eta)
	[ad(adr)] => a(AC,cc(AC,eta),eta) + cc(adr,eta),eta)
end;



		Compiler

compile[e:exp;t:adr]prog
 generic(e)
	[var]      => lo(map(e)) 
	[const]    => li(val(e))
	[sum(u,v)] =>  prog(compile(u,t),
			    prog(st(t),
			         prog(compile(v,t+1),
			              ad(t))))
end;


Notes:
	3.1-3.7 of McCarthy Painter are consequences of  data structures.
	3.13 is also consequence.


Theorem

outcome(compile(e:exp,t:adr),load(xi):environ_o) 

	=(t)
		a(AC,value(e:exp,xi:environ_s)load(xi):environ_o)

where:
map(e:var)adr   such that cc(map(e)load(xi)) = c(e,xi)

Try it:

outcome(						;load(xi):environ_o)
	compile[e:exp;t:adr]prog
	 generic(e)
		[var]      => lo(map(e))) 
		[const]    => li(val(e))
		[sum(u,v)] =>  prog(compile(u,t),
				    prog(st(t),
 				         prog(compile(v,t+1)),
				              prog(ad(t))))
	end;


equals up to t

a(AC,					 	,load(xi):environ_o)
	      value[e:exp;xi:environ_s]int
		generic(e)
	 	  [var]      => c(e,xi)
		  [const]    => val(e)
		  [sum(u,v)] => +(value(u,xi),value(v,xi))
		end;


Proof is generic on e;

i. [const]
outcome(li(val(e)),load(xi))
	= outcome(ε,step(li(val(e)),load(xi))
	= step(li(val(e)),load(xi))
	= a(AC,val(e),load(xi))


ii. [var]
outcome(lo(map(e)),load(xi))
	= outcome(ε,step(lo(map(e),load(xi)),load(xi))
	= step(lo(map(e)),load(xi))
	= a(AC,cc(map(e),load(xi)),load(xi))
	= a(AC,c(e,load(xi)),load(xi))



iii.
[sum(u,v)]
outcome( prog(compile(u,t),             ,load(xi))
  	      prog(st(t),
	           prog(compile(v,t+l)),
	                prog(ad(t))))
        )

	=

outcome(ad(t),
        outcome(compile(v,t+1)),
                outcome(st(t),
                        outcome(compile(u,t),load(xi)))))

But by induction:

outcome(compile(u,t),load(xi))))) =(t)  a(AC,value(u),load(xi)))))

So:

outcome(st(t)(
	      outcome(compile(u,t),load(xi))))) )
=

outcome(st(t)(
	       a(AC,value(u),load(xi)))))    )


=
                step(st(t),
                     a(AC,value(u),load(xi)))))

=

a(t,
  cc(AC,
     a(AC,value(u),load(xi)))
  a(AC,value(u),load(xi)))))

=(t+1)

a(t,
  cc(AC,
     a(AC,value(u),load(xi)))
  a(AC,value(u),load(xi)))))

=(t+1,AC)

a(t,
  cc(AC,
     a(AC,value(u),load(xi)))
  a(AC,value(u),load(xi)))))